package com.yox.rpc.provider;

import com.yox.rpc.enumeration.RpcError;
import com.yox.rpc.exception.RpcException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 默认的服务注册表,保存本地服务
 * 为保证线程安全，使用ConcurrentHashMap，注册的时候加互斥锁
 */
public class ServiceProviderImpl implements ServiceProvider {

    private static final Logger logger = LoggerFactory.getLogger(ServiceProviderImpl.class);

    /**
     * 将 服务名 与 服务对象 存在一个Map中，用 服务对象 实现的接口完整类名作为 服务名
     * key = 服务名称（接口全类名）
     * value = 服务实体（实现类的实例对象）
     */
    private static final Map<String, Object> serviceMap = new ConcurrentHashMap<>();

    /**
     * 存放实现类的名称
     */
    private static final Set<String> registeredService = ConcurrentHashMap.newKeySet();

    /**
     *
     * @param service 待保存的服务实体
     * @param serviceClass 服务接口类
     */
    @Override
    public synchronized  <T> void addServiceProvider(T service, String serviceName) {

        // 用实现类的名称去查询服务是否注册
        if (registeredService.contains(serviceName))
            return;
        registeredService.add(serviceName);

        serviceMap.put(serviceName,service);

        logger.info("向接口：{} 注册服务：{}", service.getClass().getInterfaces(), serviceName);
    }

    @Override
    public Object getServiceProvider(String serviceName) {
        Object service = serviceMap.get(serviceName);
        if (service == null) {
            throw new RpcException(RpcError.SERVICE_NOT_FOUND);
        }
        return service;
    }
}
